package com.xucan.pdf;

import java.util.HashMap;
import java.util.Map;

public class AdvanceDiscountContext {

    /**
     * 单例类
     */
    private volatile static AdvanceDiscountContext INSTANCE;

    /**
     * 策略类容器
     */
    private final static Map<String, DiscountStrategy> strategyMap = new HashMap<>();
    
    /**
     * 构造函数
     */
    public AdvanceDiscountContext() {
        strategyMap.put(BusinessEnum.NORMAL.getCode(), new NormalDiscountStrategy());

    }

    /**
     * 应用打折
     * 注意点：由于该方法的类是单例类，所以该方法里面不能使用共享变量，要使用局部变量，
     * 避免因为多线程访问的时候，造成数据计算错误，可能会导致线程不安全情况发生。
     * @param originalPrice
     * @return
     */
    public double applyDiscount(String useType, double originalPrice) throws Exception {
        if (strategyMap.containsKey(useType)) {
            return strategyMap.get(useType).calculateDiscountPrice(originalPrice);
        }
        throw new Exception("没有包含此类用户类型的处理策略类，请添加对应的策略类！");
    }

    /**
     * 懒加载单例类，双重判断，确保只创建一个对象。
     * @return AdvanceDiscountContext
     */
    public static AdvanceDiscountContext getInstance() {
        if (null == INSTANCE) {
            synchronized (AdvanceDiscountContext.class) {
                if (null == INSTANCE) {
                    INSTANCE = new AdvanceDiscountContext();
                }
            }
        }
        return INSTANCE;
    }
}